LOADING...

loading

TypeScript接口(interface)

接口(interface)是一个非常强大的代码类型定义描述

接口的使用

有一个函数,这个函数接受一个 User 对象,然后返回这个 User 对象的 name 属性:

const getUserName = (user) => user.name

在我们自定义的 TypeScript 开发环境下这个是会报错的:

tsconfig.json 中 配置了 "noImplicitAny": true

图片

我们必须用一种类型描述这个 user 参数,但是这个类型又不属于上一节介绍到的各种基本类型。

这个时候我们需要 interface 来描述这个类型:

interface User {
    name: string
    age: number
    isMale: boolean
}
 
const getUserName = (user: User) => user.name

这个接口 User 描述了参数 user 的结构,当然接口不会去检查属性的顺序,只要相应的属性存在并且类型兼容即可。

可选属性

那么还有一个问题,当这个 user 属性可能没有 age 时怎么办?比如我们在前端处理表单的时候,年龄 age 这个字段本身是可选的,我们应该如何用接口描述这种情况?

我们可以用可选属性描述这种情况:

interface User {
    name: string
    age?: number
    isMale: boolean
}

当我们看到代码提示的时候,这个 age 属性既可能是 number 类型也可能是 undefined

图片

只读属性

还有一个问题,当我们确定 user 的性别之后就不允许就改了, interface 可以保证这一点吗?

利用 readonly 我们可以把一个属性变成只读性质,此后我们就无法对他进行修改

interface User {
    name: string
    age?: number
    readonly isMale: boolean
}

一旦我们要修改只读属性,就会出现警告。

图片

函数类型

那么接下来,如果这个 user 含有一个函数怎么办?

比如:

user.say = function(words: string) {
    return 'hello world'
}

我们应该如何描述这种情况?一种是直接在 interface 内部描述函数:

interface User {
    name: string
    age?: number
    readonly isMale: boolean
    say: (words: string) => string
}

另一种方法,我们可以先用接口直接描述函数类型:

interface Say {
    (words: string) : string
}

然后在 User 内使用:

interface User {
    name: string
    age?: number
    readonly isMale: boolean
    say: Say
}